﻿Imports System
Imports System.Text
Imports System.Collections.Generic
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports FrameworkTeste
Imports Spring.Objects.Factory.Xml
Imports Spring.Transaction.Interceptor
Imports Spring.Transaction

<TestClass()> Public Class ClienteDaoTeste
    Inherits TesteTransacionalInjecaoDependenciaSpring

#Region " ConfigLocations "

    Protected Overrides ReadOnly Property ConfigLocations() As String()
        Get
            NamespaceParserRegistry.RegisterParser(GetType(Spring.Data.Config.DatabaseNamespaceParser))
            Return New [String]() {"assembly://Teste.Leilao.Negoc/Teste.Leilao.Negoc/AutoWired.xml"}
        End Get
    End Property

#End Region

    Private testContextInstance As TestContext
    '''<summary>
    '''Gets or sets the test context which provides
    '''information about and functionality for the current test run.
    '''</summary>
    Public Property TestContext() As TestContext
        Get
            Return testContextInstance
        End Get
        Set(ByVal value As TestContext)
            testContextInstance = value
        End Set
    End Property

#Region "Additional test attributes"
    '
    ' You can use the following additional attributes as you write your tests:
    '
    ' Use ClassInitialize to run code before running the first test in the class
    ' <ClassInitialize()> Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
    ' End Sub
    '
    ' Use ClassCleanup to run code after all tests in a class have run
    ' <ClassCleanup()> Public Shared Sub MyClassCleanup()
    ' End Sub
    '
    ' Use TestInitialize to run code before running each test
    <TestInitialize()> Public Overloads Sub Initialize()
        MyBase.DefaultRollback = False
        MyBase.Initialize()
    End Sub
    '
    ' Use TestCleanup to run code after each test has run
    ' <TestCleanup()> Public Sub MyTestCleanup()
    ' End Sub
    '
#End Region

#Region "Particoes de Equivalencia"

    'EXEMPLO: Public Const PARTICAO_XXX as String = " Select CAMPO_X from TABELA_Y "

#End Region

#Region "Classes Injetadas"

    Private _clienteDao As IClienteDao
    Public Property ClienteDao() As IClienteDao
        Get
            Return _clienteDao
        End Get
        Set(ByVal value As IClienteDao)
            _clienteDao = value
        End Set
    End Property

    Private _eventoDao As IEventoDao
    Public Property EventoDao() As IEventoDao
        Get
            Return _eventoDao
        End Get
        Set(ByVal value As IEventoDao)
            _eventoDao = value
        End Set
    End Property

    Private _usuarioDao As IUsuarioDao
    Public Property UsuarioDao() As IUsuarioDao
        Get
            Return _usuarioDao
        End Get
        Set(ByVal value As IUsuarioDao)
            _usuarioDao = value
        End Set
    End Property


    Private _objetoValorDao As IObjetoValorDao
    Public Property ObjetoValorDao() As IObjetoValorDao
        Get
            Return _objetoValorDao
        End Get
        Set(ByVal value As IObjetoValorDao)
            _objetoValorDao = value
        End Set
    End Property


    Private _contatoDao As IContatoDao
    Public Property ContatoDao() As IContatoDao
        Get
            Return _contatoDao
        End Get
        Set(ByVal value As IContatoDao)
            _contatoDao = value
        End Set
    End Property

    Private _setorNegocioDao As ISetorNegocioDao
    Public Property SetorNegocioDao() As ISetorNegocioDao
        Get
            Return _setorNegocioDao
        End Get
        Set(ByVal value As ISetorNegocioDao)
            _setorNegocioDao = value
        End Set
    End Property


    Private _particaoEquivalencia As ParticaoEquivalencia
    Public Property ParticaoEquivalencia() As ParticaoEquivalencia
        Get
            Throw New NotImplementedException("Nao esqueca de implementar o codigo abaixo")
            '_particaoEquivalencia = New ParticaoEquivalencia("UMA_CONNECTION_NAME")
            Return _particaoEquivalencia
        End Get
        Set(ByVal value As ParticaoEquivalencia)
            _particaoEquivalencia = value
        End Set
    End Property

    Private _hqlTester As IHQLTester
    Public Property HQLTester() As IHQLTester
        Get
            Return _hqlTester
        End Get
        Set(ByVal value As IHQLTester)
            _hqlTester = value
        End Set
    End Property


    Private _pessoaDao As IPessoaDao
    Public Property PessoaDao() As IPessoaDao
        Get
            Return _pessoaDao
        End Get
        Set(ByVal value As IPessoaDao)
            _pessoaDao = value
        End Set
    End Property


    Private _vendedorDao As IVendedorDao
    Public Property VendedorDao() As IVendedorDao
        Get
            Return _vendedorDao
        End Get
        Set(ByVal value As IVendedorDao)
            _vendedorDao = value
        End Set
    End Property


#End Region


    <TestMethod()> Public Sub Start()

        Dim _clientes As IList(Of Cliente)
        Dim _clientesComContatos As IList(Of Cliente)
        Dim _clientesGerencia As IList(Of Cliente)
        Dim _usuario As Usuario
        Dim _osStatus As IList(Of StatusLigacao)
        Dim _tiposContato As IList(Of AbstractTipoContato)
        Dim _setores As IList(Of SetorNegocio)
        Dim _pessoa As Pessoa
        Dim _vendedor, _vendedor01, _vendedor02 As Vendedor


        _clientes = Me.CriarClientes()
        _usuario = Me.UsuarioDao.Buscar(1)
        _osStatus = Me.CriarStatusLigacao()
        _tiposContato = Me.CriarTiposContato()
        _clientesComContatos = Me.CriarClientesComContatos02(_usuario, _tiposContato(0), _tiposContato(3))
        _setores = Me.CriarSetorNegocio(_usuario)
        _clientesGerencia = Me.CriarClientesAltaGerencia(_usuario, _tiposContato(0), _tiposContato(3), _setores(0))
        _pessoa = Me.SalvarPessoa()
        _vendedor = Me.SalvarVendedor(_pessoa, _usuario)

        _vendedor01 = Me.SalvarPessoaUsuarioVendedor("Facebuckson", "face", "9998764668")
        _vendedor02 = Me.SalvarPessoaUsuarioVendedor("Panicat", "pani", "7764288493")

        Me.CriarEventos(_clientes(0), _usuario, _osStatus(2))
        Me.CriarEventos02(_clientes(1), _usuario, _osStatus(2))


        Assert.IsTrue(True)

    End Sub

    <Transaction(TransactionPropagation.Required)> _
    Protected Function SalvarPessoaUsuarioVendedor(ByVal _nome As String, ByVal _login As String, ByVal _identificacao As String) As Vendedor


        Dim _usuario As Usuario
        Dim _pessoa As Pessoa
        Dim _vendedor As Vendedor

        _pessoa = New Pessoa With {.Cidade = "Rio de Janeiro", .DocumentoIdentificacao = _identificacao, .Email = _login & "@fgv.br", .Nome = _nome, .Uf = "RJ"}

        Me.PessoaDao.Salvar(_pessoa)

        _usuario = New Usuario With {.Login = _login, .Pessoa = _pessoa}
        Me.UsuarioDao.Salvar(_usuario)

        _vendedor = New Vendedor With {.Pessoa = _pessoa, .Usuario = _usuario}

        Me.VendedorDao.Salvar(_vendedor)

        Return _vendedor

    End Function

    <Transaction(TransactionPropagation.Required)> _
    Protected Function SalvarVendedor(ByVal _pessoa As Pessoa, ByVal _usuario As Usuario) As Vendedor

        Dim _vendedor As Vendedor

        _vendedor = New Vendedor

        With _vendedor
            .Pessoa = _pessoa
            .Usuario = _usuario
        End With

        Me.VendedorDao.Salvar(_vendedor)

        Return _vendedor

    End Function


    <Transaction(TransactionPropagation.Required)> _
    Protected Function SalvarPessoa() As Pessoa
        Dim _pessoa As Pessoa
        _pessoa = New Pessoa
        With _pessoa
            .Cidade = "Rio de Janeiro"
            .DocumentoIdentificacao = "120719989"
            .Email = "teste@fgv.br"
            .Nome = "Ateocláudio"
            .Uf = "RJ"
        End With

        Me.PessoaDao.Salvar(_pessoa)

        Return _pessoa

    End Function

    <Transaction(TransactionPropagation.Required)> _
Protected Function CriarClientesAltaGerencia(ByVal _usuario As Usuario, ByVal _tipoTelefone As TipoTelefone, ByVal _tipoEmail As TipoEmail, ByVal _setorGerencia As SetorNegocio) As IList(Of Cliente)

        Dim _cliente, _cliente02 As Cliente
        Dim _clientes As IList(Of Cliente)
        Dim _contato1, _contato2, _contato3 As Contato
        Dim _setores As IList(Of SetorNegocio)

        _setores = New List(Of SetorNegocio)
        _setores.Add(_setorGerencia)

        '--
        _cliente = New Cliente With {.Nome = "Eike", .CPF = "088", .SetoresProprietarios = _setores}
        Me.ClienteDao.Salvar(_cliente)

        '_contato1 = New Telefone With {.Cliente = _cliente, .DDD = "21", .Numero = "39668755", .TipoTelefone = _tipoTelefone, .Usuario = _usuario}
        '_contato2 = New Email With {.Cliente = _cliente, .Endereco = "eike.grupoX@gmail.com", .TipoEmail = _tipoEmail, .Usuario = _usuario}

        'Me.ContatoDao.Salvar(_contato1)
        'Me.ContatoDao.Salvar(_contato2)

        '--
        _cliente02 = New Cliente With {.Nome = "Silas", .CPF = "033", .SetoresProprietarios = _setores}
        Me.ClienteDao.Salvar(_cliente02)

        '_contato3 = New Telefone With {.Cliente = _cliente02, .DDD = "21", .Numero = "55687422", .TipoTelefone = _tipoTelefone, .Usuario = _usuario}
        'Me.ContatoDao.Salvar(_contato3)


        _clientes = New List(Of Cliente)

        _clientes.Add(_cliente)
        _clientes.Add(_cliente02)

        Return _clientes

    End Function

    <Transaction(TransactionPropagation.Required)> _
Protected Function CriarSetorNegocio(ByVal _usuario As Usuario) As IList(Of SetorNegocio)

        Dim _setor01, _setor02 As SetorNegocio
        Dim _setores As IList(Of SetorNegocio)

        _setor01 = New SetorNegocio With {.Codigo = "GERENCIA", .Nome = "Gerência estratégica", .Usuario = _usuario}
        _setor02 = New SetorNegocio With {.Codigo = "Classe A", .Nome = "Produtos Classe A", .Usuario = _usuario}

        Me.SetorNegocioDao.Salvar(_setor01)
        Me.SetorNegocioDao.Salvar(_setor02)

        _setores = New List(Of SetorNegocio)

        With _setores
            .Add(_setor01) : .Add(_setor02)
        End With

        Return _setores

    End Function

    <Transaction(TransactionPropagation.Required)> _
Protected Function CriarClientesComContatos02(ByVal _usuario As Usuario, ByVal _tipoTelefone As TipoTelefone, ByVal _tipoEmail As TipoEmail) As IList(Of Cliente)

        Dim _cliente, _cliente02 As Cliente
        Dim _clientes As IList(Of Cliente)
        Dim _contato1, _contato2, _contato3 As Contato

        '--
        _cliente = New Cliente With {.Nome = "Carlos", .CPF = "088"}
        Me.ClienteDao.Salvar(_cliente)

        '_contato1 = New Telefone With {.Cliente = _cliente, .DDD = "21", .Numero = "23637785", .TipoTelefone = _tipoTelefone, .Usuario = _usuario}
        '_contato2 = New Email With {.Cliente = _cliente, .Endereco = "xyz@gmail.com", .TipoEmail = _tipoEmail, .Usuario = _usuario}

        'Me.ContatoDao.Salvar(_contato1)
        'Me.ContatoDao.Salvar(_contato2)

        '--
        _cliente02 = New Cliente With {.Nome = "Malaquias", .CPF = "033"}
        Me.ClienteDao.Salvar(_cliente02)

        '_contato3 = New Telefone With {.Cliente = _cliente02, .DDD = "21", .Numero = "20278867", .TipoTelefone = _tipoTelefone, .Usuario = _usuario}
        'Me.ContatoDao.Salvar(_contato3)


        _clientes = New List(Of Cliente)

        _clientes.Add(_cliente)
        _clientes.Add(_cliente02)

        Return _clientes

    End Function

    <Transaction(TransactionPropagation.Required)> _
    Protected Function CriarTiposContato() As IList(Of AbstractTipoContato)

        Dim _tipos As List(Of AbstractTipoContato)
        Dim _tipoTel01, _tipoTel02, _tipoTel03 As TipoTelefone
        Dim _tipoEmail01, _tipoEmail02 As TipoEmail
        Dim _outro01, _outro02 As OutroTipoContato

        _tipoTel01 = New TipoTelefone With {.Codigo = "RES", .Descricao = "Residencial"}
        _tipoTel02 = New TipoTelefone With {.Codigo = "COM", .Descricao = "Comercial"}
        _tipoTel03 = New TipoTelefone With {.Codigo = "CEL", .Descricao = "Celular"}

        _tipos = New List(Of AbstractTipoContato)
        With _tipos
            .Add(_tipoTel01) : .Add(_tipoTel02) : .Add(_tipoTel03)
        End With

        _tipoEmail01 = New TipoEmail With {.Codigo = "PESS", .Descricao = "Pessoal"}
        _tipoEmail02 = New TipoEmail With {.Codigo = "COM", .Descricao = "Comercial"}

        With _tipos
            .Add(_tipoEmail01) : .Add(_tipoEmail02)
        End With

        _outro01 = New OutroTipoContato With {.Codigo = "TWEET", .Descricao = "Tweeter"}
        _outro02 = New OutroTipoContato With {.Codigo = "FACE", .Descricao = "Facebook"}

        With _tipos
            .Add(_outro01) : .Add(_outro02)
        End With

        For Each _tipo In _tipos
            Me.ObjetoValorDao.Salvar(_tipo)
        Next


        Return _tipos

    End Function


    <Transaction(TransactionPropagation.Required)> _
    Protected Function CriarStatusLigacao() As IList(Of StatusLigacao)

        Dim _status01, _status02, _status03 As StatusLigacao
        Dim _osStatus As IList(Of StatusLigacao)


        _status01 = New StatusLigacao With {.Codigo = "PENDENTE", .Descricao = "Está pendente de ser respondida"}

        _status02 = New StatusLigacao With {.Codigo = "EM ATENDIMENTO", .Descricao = "Está em execução"}

        _status03 = New StatusLigacao With {.Codigo = "FINALIZADA", .Descricao = "Está finalizada"}

        Me.ObjetoValorDao.Salvar(_status01)
        Me.ObjetoValorDao.Salvar(_status02)
        Me.ObjetoValorDao.Salvar(_status03)

        _osStatus = New List(Of StatusLigacao)

        _osStatus.Add(_status01)
        _osStatus.Add(_status02)
        _osStatus.Add(_status03)

        Return _osStatus

    End Function

    <Transaction(TransactionPropagation.Required)> _
    Protected Function CriarClientes() As IList(Of Cliente)

        Dim _cliente As Cliente
        Dim _cliente02 As Cliente
        Dim _cliente03 As Cliente
        Dim _clientes As IList(Of Cliente)

        _cliente = New Cliente With {.Nome = "Leonardo", .CPF = "098"}
        Me.ClienteDao.Salvar(_cliente)

        _cliente02 = New Cliente With {.Nome = "Guilherme", .CPF = "037"}
        Me.ClienteDao.Salvar(_cliente02)

        _cliente03 = New Cliente With {.Nome = "Paulo", .CPF = "027"}
        Me.ClienteDao.Salvar(_cliente03)

        _clientes = New List(Of Cliente)

        _clientes.Add(_cliente)
        _clientes.Add(_cliente02)
        _clientes.Add(_cliente03)

        Return _clientes

    End Function

    <Transaction(TransactionPropagation.Required)> _
    Protected Sub CriarEventos(ByVal _cliente As Cliente, ByVal _usuario As Usuario, ByVal _statusLigacao As StatusLigacao)

        Dim _callIN01 As Evento
        Dim _callOUT01 As Evento
        Dim _email01 As Evento
        Dim _email02 As Evento

        _callIN01 = New CallIN With {.NumeroCliente = "2137996463", .NumeroLocal = "2122242641", .Cliente = _cliente, .Usuario = _usuario, .Status = _statusLigacao}
        Me.EventoDao.Salvar(_callIN01)

        _callOUT01 = New CallOUT With {.NumeroCliente = "2137996463", .NumeroLocal = "2122242641", .Cliente = _cliente, .Observacao = "Informando que problema foi resolvido", .Usuario = _usuario, .Status = _statusLigacao}
        Me.EventoDao.Salvar(_callOUT01)

        _email01 = New EmailOUT With {.Cliente = _cliente, .De = "lsantana@fgv.br", .Para = "flavio@fgv.br, guilherme@fgv.br", .Mensagem = "Mensagem teste", .Usuario = _usuario}
        Me.EventoDao.Salvar(_email01)


        _email02 = New EmailOUT With {.Cliente = _cliente, .De = "lsantana@fgv.br", .Para = "flavio@fgv.br, guilherme@fgv.br, bruno@fgv.br", .Mensagem = "Mensagem em resposta a", .Usuario = _usuario, .EventoPrecedente = _callIN01}
        Me.EventoDao.Salvar(_email02)

    End Sub

    <Transaction(TransactionPropagation.Required)> _
    Protected Sub CriarEventos02(ByVal _cliente As Cliente, ByVal _usuario As Usuario, ByVal _statusLigacao As StatusLigacao)

        Dim _callIN01 As Evento
        Dim _callOUT01 As Evento
        Dim _email01 As Evento
        Dim _email02 As Evento

        _callIN01 = New CallIN With {.NumeroCliente = "2137996425", .NumeroLocal = "2122242641", .Cliente = _cliente, .Usuario = _usuario, .Status = _statusLigacao}
        Me.EventoDao.Salvar(_callIN01)

        _callOUT01 = New CallOUT With {.NumeroCliente = "2137996428", .NumeroLocal = "2122242641", .Cliente = _cliente, .Observacao = "Reclamação sobre boleto", .Usuario = _usuario, .Status = _statusLigacao}
        Me.EventoDao.Salvar(_callOUT01)

        _email01 = New EmailIN With {.Cliente = _cliente, .De = "lsantana@fgv.br", .Para = "guilherme@fgv.br", .Mensagem = "Prezado, estou com o valor do boleto errado", .Usuario = _usuario}
        Me.EventoDao.Salvar(_email01)

        _email02 = New EmailOUT With {.Cliente = _cliente, .De = "lsantana@fgv.br", .Para = "ivo@fgv.br, bruno@fgv.br", .Mensagem = "Prezado, corrigimos seu boleto.. ", .Usuario = _usuario, .EventoPrecedente = _email01}
        Me.EventoDao.Salvar(_email02)

    End Sub

    <TestMethod()> Public Sub Salvar()

        Dim _cliente As Cliente

        _cliente = New Cliente

        With _cliente
            .Nome = "Leonardo"
            .CPF = "098"
        End With

        Me.ClienteDao.Salvar(_cliente)

        Assert.IsTrue(_cliente.Id.HasValue)

    End Sub

    <TestMethod()> Public Sub Buscar_HQL()
        Dim _objetos As IList(Of Object)

        Dim _hql As String = " Select cliente From Cliente as cliente "

        _objetos = Me.HQLTester.Buscar(_hql)

        Assert.IsTrue(True)
    End Sub

    '<TestMethod()> Public Sub Nome_Da_Operacao_Negativo()
    '    Assert.Inconclusive("Exemplo de teste negativo")
    'End Sub

End Class


